/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import clases.Categoria;
import com.alee.extended.panel.GroupPanel;
import com.alee.laf.button.WebButton;
import com.alee.laf.label.WebLabel;
import com.alee.laf.optionpane.WebOptionPane;
import com.alee.laf.panel.WebPanel;
import com.alee.laf.rootpane.WebDialog;
import com.alee.laf.rootpane.WebFrame;
import com.alee.laf.text.WebTextField;
import controlador.CtrlCategoria;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.ImageIcon;

/**
 *
 * @author Edder
 */
public class FrmCategoria extends WebDialog implements ActionListener{
    private Categoria categoria;
    private CtrlCategoria ctrlCategoria;
    
    private WebTextField txtNombre;
    private WebButton btnEliminar, btnGuardar, btnCancelar;
    
    FrmCategoria(WebFrame owner, boolean modal){
        super(owner, modal);
        setTitle("Categoría");
        setDefaultCloseOperation(WebFrame.DISPOSE_ON_CLOSE);
        setSize(300,100);
        setShowResizeCorner(false);
        setShowMaximizeButton(false);
        initComponents();
        setLocationRelativeTo(null);
        this.setCategoria(null);
    }
    
    FrmCategoria(WebFrame owner, boolean modal, Categoria categoria){
        this(owner, modal);
        setCategoria(categoria);
    }
    
    FrmCategoria(WebFrame owner, boolean modal, int idCategoria){
        this(owner, modal);
        setCategoria(idCategoria);
    }
    
    /**
     * Carga la información de una categoría para editar o eliminar
     * @param categoria
     */
    public final void setCategoria(Categoria categoria){
        this.categoria = categoria;
        llenarDatos();
    }
    
    /**
     * Busca una categoría en la base da datos y luego carga la información para editar o eliminar
     * @param idCategoria
     */
    public final void setCategoria(int idCategoria){
        try {
            this.categoria = this.ctrlCategoria.get(idCategoria, null);
        } catch (ClassNotFoundException | SQLException ex) {
            this.categoria = null;
        } finally{
            if(this.categoria == null)
                WebOptionPane.showMessageDialog(
                        this,
                        "No se pudo cargar la categoría",
                        "Error", 
                        WebOptionPane.ERROR_MESSAGE);
            llenarDatos();
        }
    }
    
    /**
     * obtiene la información de la categoría y llena los campos del formulario
     */
    private void llenarDatos(){
        if(this.categoria != null){
            this.txtNombre.setText(this.categoria.getNombre());
            this.btnEliminar.setVisible(true);
        }else{
            this.btnEliminar.setVisible(false);
        }        
    }
    
    /**
     * Elimina una categoría
     */
    private void eliminar(){
        if(WebOptionPane.showConfirmDialog(
                this,
                "¿Seguro que desea eliminar esta categoría?",
                "Advertencia",
                WebOptionPane.YES_NO_OPTION,
                WebOptionPane.WARNING_MESSAGE) == WebOptionPane.YES_OPTION)
            try {
                this.ctrlCategoria.eliminar(this.categoria, null);
                WebOptionPane.showMessageDialog(
                        this,
                        "Categoría eliminada",
                        "Éxito",
                        WebOptionPane.INFORMATION_MESSAGE);
                this.dispose();
            } catch (ClassNotFoundException | SQLException ex) {
                WebOptionPane.showMessageDialog(
                        this,
                        "No se pudo eliminar la categoría, posiblemente hay artículos de esta categoría,"
                                + " verificar e intentar nuevamente",
                        "Error",
                        WebOptionPane.ERROR_MESSAGE);
            }
    }
    
    /**
     * Guarda la información, si está creando uno nuevo, inserta en la base de datos, sino actualiza
     */
    private void guardar(){
        if(this.categoria == null){
            this.categoria = new Categoria();
            this.categoria.setIdCategoria(-1);
        }
        prepararDatos();
        if(this.categoria.getIdCategoria() == -1){
            try {
                //Crear
                this.ctrlCategoria.insert(this.categoria, null);
                WebOptionPane.showMessageDialog(
                        this,
                        "Información registrada correctamente",
                        "Éxito",
                        WebOptionPane.INFORMATION_MESSAGE);
                this.dispose();
            } catch (ClassNotFoundException | SQLException ex) {
                WebOptionPane.showMessageDialog(
                        this,
                        "No se pudo guardar la información, verificar e intentar nuevamente",
                        "Error",
                        WebOptionPane.ERROR_MESSAGE);
            }
        }else{
            try {
                this.ctrlCategoria.update(this.categoria, null);
                WebOptionPane.showMessageDialog(
                        this,
                        "Información registrada correctamente",
                        "Éxito",
                        WebOptionPane.INFORMATION_MESSAGE);
                this.dispose();
            } catch (ClassNotFoundException | SQLException ex) {
                WebOptionPane.showMessageDialog(
                        this,
                        "No se pudo guardar la información, verificar e intentar nuevamente",
                        "Error",
                        WebOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
    /**
     * obtiene la información de los campos del formulario y llena los atributos de la categoría
     */
    private void prepararDatos(){
        this.categoria.setNombre(this.txtNombre.getText());
    }
    
    /**
     * Inicializa los componentes del formulario
     */
    private void initComponents(){
        this.ctrlCategoria = new CtrlCategoria();
        this.categoria = null;
        this.txtNombre = new WebTextField(20);
        this.btnGuardar = new WebButton("Guardar", new ImageIcon(getClass().getResource("/resources/img/disk.png")));
        this.btnCancelar = new WebButton("Cancelar", new ImageIcon(getClass().getResource("/resources/img/cancel.png")));
        this.btnEliminar = new WebButton("Eliminar", new ImageIcon(getClass().getResource("/resources/img/delete.png")));
        
        add(new WebPanel(){
            {
                setLayout(new BorderLayout());
                add(new GroupPanel(){
                    {
                        setLayout(new BorderLayout());
                        add(new WebLabel("Nombre"), BorderLayout.WEST);
                        add(txtNombre, BorderLayout.CENTER);
                    }
                }, BorderLayout.CENTER);
                add(new GroupPanel(){
                    {
                        setLayout(new FlowLayout(FlowLayout.RIGHT));
                        add(btnEliminar, btnGuardar, btnCancelar);
                    } 
                }, BorderLayout.SOUTH);
            }
        });
        
        this.btnEliminar.addActionListener(this);
        this.btnCancelar.addActionListener(this);
        this.btnGuardar.addActionListener(this);
        
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == this.btnCancelar){
            if(WebOptionPane.showConfirmDialog(
                    this,
                    "¿Está seguro que desea cerrar?",
                    "Advertencia",
                    WebOptionPane.YES_NO_OPTION,
                    WebOptionPane.WARNING_MESSAGE) == WebOptionPane.YES_OPTION)
                this.dispose();
        }else if(e.getSource() == this.btnEliminar){
            this.eliminar();
        }else if(e.getSource() == this.btnGuardar){
            this.guardar();
        }
    }
}
